# 三种参数类型  默认参数  关键字参数  特殊参数

# 默认参数
from typing import List


def m0(p1, p2=2):
    print(1, 2)


# 调用
m0(1)
m0(1, 2)
#
print('-------------------')


# 关键字参数
def m1(p1, p2="2", p3="3"):
    print(p1, p2, p3)


# 函数调用时，关键字参数必须跟在位置参数后面
# 报错没有位置参数
# m1(p2=3)
# m1(p2=2,p3=3)
# 不会报错 通过关键字调用的方式调用位置参数
m1(p1=1)
# 调用顺序不重要
m1(1, p3=3, p2=2)

print('------------------------')


# *p2 接受元祖类型（可变参数） **p3接受字典
def m2(p1, *p2, **p3):
    print(p1)
    for i in p2:
        print(i)
    for k in p3:
        print(k, ":", p3[k])


# 调用
p1 = 1
p2 = (2, 3)
p3 = {"k1": "4", "k2": 5}
m2(p1, p2, p3)
print('+++++++++++++++')
m2(1, '2', '3', k1=3, k2=6, k3=7)


# 特殊参数 定义方法是指定参数类型 调用是必须按指定类型传参否则报错
# 接受参数方式 位置和关键字参数都行
def standard_arg(arg):
    print(arg)


# 接受参数方式 仅可以使用位置参数
def pos_only_arg(arg, /):
    print(arg)


# 接受参数方式 仅可以使用关键字参数
def kwd_only_arg(*, arg):
    print(arg)


# 三种参数
def combined_example(pos_only, /, standard, *, kwd_only):
    print(pos_only, standard, kwd_only)


# 调用测试
standard_arg(1)
standard_arg(arg=1)
print('==================')
pos_only_arg(1)
# 报错
# pos_only_arg(arg=1)
# 报错
# kwd_only_arg(1)
# 正确
kwd_only_arg(arg=1)

# 三种方式
combined_example(1, 2, kwd_only=3)
combined_example(1, standard=2, kwd_only=3)

# lambda 表达式 （匿名函数）
la = lambda arg1, arg2: arg1 * arg2
print('--------------------------------')
print(la(2, 4))


# https://docs.python.org/zh-cn/3/tutorial/controlflow.html  4.7.8. 函数注解之标注
# 形参标注 语法 x:类型(表示形参接受的类型)
# 返回值标注 -> 类型（表示返回值类型）
def abs_max(x: List[int]) -> int:
    """
    >>> abs_max([0,5,1,11])
    11
    >>> abs_max([3,-10,-2])
    -10
    """
    j = x[0]
    for i in x:
        if abs(i) > abs(j):
            j = i
    return j


print("00000000000000000000")
print(abs_max([1, 4, 7, 0, 8, 90]))
